/*导入OhosAppContext和OhosPluginId，用于动态修改app.json5配置中的版本号等信息*/
import { appTasks, OhosAppContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin';

/*导入FileUtil，用于复制打包后的hap包和app包文件和判断文件路径是否存在*/
import { hvigor, FileUtil } from '@ohos/hvigor'

/*导入hvigorfileConfig.ts中的getLocalFileContent方法*/
import { getLocalFileContent } from './hvigorfileConfig.ts';

/*获取配置参数的全局对象*/
let localData = getLocalFileContent()
console.info("===========================config===========================")
/*输出local.properties配置参数*/
console.info(JSON.stringify(localData,null,1))

/*记录打包编译时，当前的product*/
let _productName = "def"
/*记录打包编译时，当前的包名*/
let _bundleName = "def"
/*记录当前打包编译时的版本号*/
let _versionCode = "def"
/*记录当前打包编译时的版本名称*/
let _versionName = "def"
/*记录当前打包编译时的app名称*/
let appName = ""

/*获取根项目的节点*/
let rootNode = hvigor.getRootNode()

/*为根节点添加一个afterNodeEvaluate hook 在hook中修改app.json5的内容并生效*/
hvigor.getRootNode().afterNodeEvaluate(rootNode => {
  /*获取app插件的上下文对象*/
  const appContext = rootNode.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;

  /*获取当前product*/
  const productName = appContext.getCurrentProduct().getProductName() ?? ""

  /*通过上下文对象获取从app.json5文件中读出来的obj对象*/
  const appJsonOpt = appContext.getAppJsonOpt();
  /*通过上下文对象获取从根目录build-profile.json5文件中读出来的obj对象,可用于修改app中的signingConfigs*/
  const buildProfileOpt = appContext.getBuildProfileOpt();

  /*修改AppScope/app.json5中的版本号-数据来源于local.properties中的参数配置*/
  if (productName.toLowerCase().indexOf("agc") >= 0) {
    /*上架应用市场的版本号*/
    appJsonOpt['app']['versionCode'] = localData["versionCode"]
    appJsonOpt['app']['versionName'] = localData["versionName"] + ""
  } else {
    /*企业分发的版本号或者各个马甲包的版本号*/
    appJsonOpt['app']['versionCode'] = localData["companyVersionCode"]
    appJsonOpt['app']['versionName'] = localData["companyVersionName"] + ""
  }

  /*将appJsonOpt对象设置回上下文对象以使能到构建的过程与结果中*/
  appContext.setAppJsonOpt(appJsonOpt);

  /*保存打包的相关信息，用于自定义app包名称*/
  _productName = productName
  _versionCode = appJsonOpt['app']['versionCode']
  _versionName = appJsonOpt['app']['versionName']

  /*获取当前编译时生成的时间*/
  /*getLocalFileContent()方法被调用时生成的时间*/
  let timeStr = localData["buildTime"]

  /*遍历工程目录下的build-profile.json5文件中app-->products节点的数据*/
  const products = buildProfileOpt['app']['products']
  for (let i = 0; i < products.length; i++) {
    const item = products[i]
    /*设置打包时间*/
    /*buildOption,arkOptions,buildProfileFields,buildTime需要在build-profile.json5提前定义出来*/
    item?.["buildOption"]?.["arkOptions"]?.["buildProfileFields"]?.["buildTime"] = timeStr
    let output=item["output"]
    if (output && output["artifactName"]) {
      let tempProductName = item["name"]
      if (tempProductName) {
        /*设置正式环境或者测试环境地址*/
        if(tempProductName.toLowerCase().indexOf("test")>=0){
          /*如果product含有test，则配置为测试环境地址*/
          item?.["buildOption"]?.["arkOptions"]?.["buildProfileFields"]?.["url"] = localData["devUrl"]
        }else{
          item?.["buildOption"]?.["arkOptions"]?.["buildProfileFields"]?.["url"] = localData["OfficialUrl"]
        }

        /*设置打包输出文件的自定义名称*/
        /*格式为：版本号+自定义名字+product+时间.app*/
        const resultName = output["artifactName"] = _versionCode + "Harmony_" + tempProductName + "_" + timeStr
        if (item["name"] == productName) {
          /*如果是当前product，记录打包时的app文件名和bundleName*/
          appName = resultName
          _bundleName = item["bundleName"]
          if(!_bundleName){
            /*如果没有在build-profile.json5设置bundleName,直接获取app.json5中的bundleName*/
            _bundleName=appJsonOpt['app']['bundleName']
          }
        }
      }
    }
  }
  /*将buildProfileOpt对象设置回上下文对象以使能到构建的过程与结果中*/
  appContext.setBuildProfileOpt(buildProfileOpt);

})

/*添加一个构建结束的回调函数(打包完成后，复制app文件到新目录+输出相关信息)*/
hvigor.buildFinished(buildResult => {
  const path = require('path');
  const appContext = rootNode.getContext(OhosPluginId.OHOS_APP_PLUGIN) as OhosAppContext;
  /*获取.app文件所在目录*/
  let dirPath = appContext.getBuildProductOutputPath()
  /*获取.app文件完整路径*/
  let appPath = path.join(dirPath, appName + ".app")
  // console.info("======appPath=====" + appPath)

  /*如果.app文件存在，就复制到新目录下*/
  if (FileUtil.exist(appPath)) {
    const parentPath = path.join(path.dirname(__filename), "_app")
    /*如果工程的根目录没有_app目录，则创建*/
    FileUtil.ensureDirSync(parentPath)
    /*目标文件路径*/
    const destPath = path.join(parentPath, appName + ".app")
    console.info("======destPath=====" + destPath)
    /*将打包完成的.app文件复制到项目根目录下的_app目录中*/
    FileUtil.copyFileSync(appPath, destPath)
  }
  /*复制完成后，打印当前编译出的包信息*/
  console.info("================================================")
  console.info("buildTime  :" + localData["buildTime"])
  console.info("productName:" + _productName)
  console.info("bundleName :" + _bundleName)
  console.info("versionCode:" + _versionCode)
  console.info("versionName:" + _versionName)
})


export default {
  system: appTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
  plugins: []         /* Custom plugin to extend the functionality of Hvigor. */
}
